/*-----------------------------
*
* For    算法数据结构
* IDE    DEV-CPP4.9.2
* Auhtor  Czp
* Date   2012/11/4
*------------------------------
*/
//防止重复导入 
#ifndef       __ARRAY_LIST_H
#define      __ARRAY_LIST_H

//如果C++里调用,采用C编译器 
#ifdef __cplusplus 
   extern "C" {
#endif

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
    
#include "Element.h"

#define Element MUSIC


//检查是否成功申请内存 
#define Asert(par) if(par==NULL) {\
                printf("%s,%d malloc null",__FILE__,__LINE__);\
                return NULL;}
#define INIT_SIZE 10    //默认的数组大小 

//typedef int Element;    //定义List里的元素类型
//typedef MUSIC Element;  //定义List里的元素类型
typedef void (*PrtFun)(Element);//打印函数 
typedef int  (*CmpFun)(Element,Element,int cla);//比较函数 
typedef struct T_ArrayList{ //定义ArrayList 
      Element *data; //List的元素    
      size_t   size; //List可以容纳个数 
      size_t   index;//当前已有元素索引 
      CmpFun   cmpFun;//比较函数指针 
      PrtFun   ptrFun;//打印函数指针 
}ArrayList;

extern void prt(Element x);
extern int cmp(Element x,Element y,int cla);

/*********************************
*@desc:创建ArrayList
*@return: NULL->内存申请失败 
          arr->指向ArrayList的指针   
**********************************            
*/
extern ArrayList *createArrayList(CmpFun cmp,PrtFun pfun);
/*******************************
*@desc: 释放ArrayList占有的内存 
******************************
*/
extern void desrotyArrList(ArrayList *arr);

/*************************************
*@desc: 检查链表的剩余空间,不够则申请
*@param: arr->要检查的链表 
*@notice: 本函数不检查参数是否合法 
*************************************
*/
//extern static Element *checkAndPre(ArrayList *arr);
/****************************
*@desc: 在末尾添加元素
*@param: arr->对那个arrlist添加 
*@parm: elm->要添加的元素
*@return:1->成功 
         0->失败 
****************************** 
*/
extern int addElement(ArrayList *arr, Element elm);
/****************************
*@desc: 把指定的位置设置为elm
*@param: arr->待插入的列表
*@param: elm->待插入的元素 
*@param: i->待设置的位置 
*@return:1->成功 
         0->失败 
*****************************         
*/
extern int setElement(ArrayList *arr,Element elm,int i);

/************************
*@desc: 打印ArrayList
*@param:arr->要打印的列表
*@param:fun->打印函数 
************************* 
**/
extern void printArrayList(ArrayList *arr);
/************************
*@desc:列表是否为空
*param:arr->待检查的列表 
*@return:1->非空 0->空 
******************* ****
*/
extern int isEmpty(ArrayList *arr);
/**************************************
*@desc:获取指定位置的元素
*@param:arr->待查找的列表
*@param:index->索引 
*@return:NULL->索引错误否则返回元素指针
*************************************** 
*/
extern Element *getElement(ArrayList *arr,size_t index);
/**************************
*@desc:获取某个元素的位置
*@param:arr>列表
*@param:elm->元素 
*@param:  fun->比较函数 
*@return:-1->找不到 
***************************/
extern int arrLstIndexof(ArrayList *arr,Element elm,int cla);
/*************************
*@desc：是否包含指定的元素
*@param: elm->元素
*@param:  arr->列表 
*@param:  fun->比较函数 
*return 0->包含 -1->不包含 
****************************
*/
extern int  contains(ArrayList *arr,Element elm,int cla);
/************************
*@desc:移除指定的元素
*@param:arr->待操作的列表
*@param:elm->要移除的元素
*@param:fun->比较函数 
*@return:0->失败1->成功 
**************************
*/
extern int  removeElement(ArrayList *arr,Element elm);

#ifdef __cplusplus
   }
#endif
   
#endif //end with ifndef ARRAY_LIST_H


